package pe.gob.foncodes.ssa.web.controller;

import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Modulo;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Perfil;
import pe.gob.foncodes.ssa.web.beans.OpcionesModuloBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

public class ReporteOpcionesModuloController extends GenericController {

    protected static Logger log = Logger.getLogger(ReporteOpcionesModuloController.class);
    private Long busSistema;
    private Long busModulo;
    private Long busPerfil;
    private String busCodUsuario;
    private List<Perfil> lstPerfil;
    private List<Modulo> lstModulo;
    private List<Modulo> lstSistema;
    private List<OpcionesModuloBean> olstOpciones = null;
    TreeNode rootOpciones;
    TreeNode selectedOpcionNode;

    @Override
    public void init() throws ServiceException {
        llenarSistema();
        lstPerfil = new ArrayList<Perfil>();
        this.busCodUsuario = "";
        this.busModulo = new Long(-99);
        this.busSistema = new Long(-99);
        this.busPerfil = new Long(-99);
        this.olstOpciones = null;
        selectedOpcionNode = null;
    }

    @Override
    public void search(ActionEvent event) throws Exception {
        this.rootOpciones = new DefaultTreeNode(new OpcionesModuloBean(), null);
        this.rootOpciones.setExpanded(true);
        //TreeNode rootPadre = null;
        TreeNode rootActual = new DefaultTreeNode();
        int level = 0;
        if(this.busModulo == null){
            this.busModulo = new Long(-99);
        }
        if(this.busSistema == null){
            this.busSistema = new Long(-99);
        }
        if(this.busCodUsuario == null){
            this.busCodUsuario = "-99";
        }
        if(this.busCodUsuario.trim().equals("")) {
            this.busCodUsuario = "-99";
        }
        this.busModulo = (this.busSistema == -99 || this.busSistema == null)?-99:(this.busModulo == -99 || this.busModulo == null)?this.busSistema:this.busModulo;
        this.busPerfil = (this.busPerfil == -99 || this.busPerfil == null)?-99:this.busPerfil;
        this.busCodUsuario = (this.busCodUsuario == null)?"-99":this.busCodUsuario.trim().toUpperCase();
        List<Object[]> lstResult = getService().reporteOpcionxModulo(busModulo, busPerfil, busCodUsuario);
        this.olstOpciones = new ArrayList<OpcionesModuloBean>();
        for(Object[] result: lstResult){
            OpcionesModuloBean oOpciones = new OpcionesModuloBean();

            oOpciones.setID(Long.parseLong(result[0].toString()));
            oOpciones.setMODULO(result[2].toString());
            oOpciones.setMODULO_GRILLA(result[2].toString().trim());
            oOpciones.setVERSION((result[3]==null)?"":(String)result[3]);
            oOpciones.setTIPO((result[4]==null)?"":(String)result[4]);
            oOpciones.setESTADO((result[5]==null)?"":(String)result[5]);
            oOpciones.setLEVEL(Integer.parseInt(result[7].toString()));
            oOpciones.setTIPONODO(result[6].toString());//sistemas / modulos / sub modulos

            this.olstOpciones.add(oOpciones);

            if (oOpciones.getLEVEL() == 1) {
                rootActual = new DefaultTreeNode(oOpciones, this.rootOpciones);
            } else if (oOpciones.getLEVEL() == level) {
                rootActual = new DefaultTreeNode(oOpciones, rootActual.getParent());
            } else if (oOpciones.getLEVEL() == level + 1) {
                rootActual = new DefaultTreeNode(oOpciones, rootActual);
            } else if (oOpciones.getLEVEL() < level) {
                for (int j = level; j > oOpciones.getLEVEL(); j--) {
                    rootActual = rootActual.getParent();
                }
                rootActual = new DefaultTreeNode(oOpciones, rootActual.getParent());
            }
            rootActual.setExpanded(true);
            level = oOpciones.getLEVEL();

        }
        selectedOpcionNode = null;
        log.info("olstOpciones = "+olstOpciones.size());
    }

    public void limpiar() throws ServiceException {
        this.busPerfil = new Long(-99);
        this.busSistema = new Long(-99);
        this.busModulo = new Long(-99);
        this.busCodUsuario = "";
        this.rootOpciones = null;
        this.olstOpciones = null;
        llenarSistema();
        lstModulo = new ArrayList<Modulo>();
        lstPerfil = new ArrayList<Perfil>();
    }

    public void print(int tipo) throws ServiceException, ClassNotFoundException, IOException, JRException {
        try {

            Collection col = new ArrayList();
            for (OpcionesModuloBean oOpcion : this.olstOpciones) {
                col.add(oOpcion);
            }

            String filtros = "";

            if (this.busSistema != null && this.busSistema != -99) {
                Modulo oModulo = (Modulo) getService().findByNamedQuery("Modulo.findByNidModulo", new Object[]{this.busSistema}).get(0);
                filtros = String.format("%s %s %s , ", filtros, "Sistema: ", oModulo.getTxtModulo());
            } else {
                filtros = String.format("%s %s , ", filtros, "Sistema: (Todos)");
            }

            if (this.busModulo != null && this.busModulo != -99) {
                Modulo oModulo = (Modulo) getService().findByNamedQuery("Modulo.findByNidModulo", new Object[]{this.busModulo}).get(0);
                filtros = String.format("%s %s %s , ", filtros, "Módulo: ", oModulo.getTxtModulo());
            } else {
                filtros = String.format("%s %s , ", filtros, "Módulo: (Todos)");
            }

            if (this.busPerfil != null && this.busPerfil != -99) {
                Perfil oPerfil = (Perfil) getService().findByNamedQuery("Perfil.findByIdPerfil", new Object[]{this.busPerfil}).get(0);
                filtros = String.format("%s %s %s , ", filtros, "Perfil: ", oPerfil.getTxtPerfil());
            } else {
                filtros = String.format("%s %s , ", filtros, "Módulo: (Todos)");
            }

            if (this.busCodUsuario != null && !this.busCodUsuario.equals("")) {
                filtros = String.format("%s %s , ", "Código usuario:", this.busCodUsuario);
            }

            if (filtros == null || filtros.equals("")) {
                filtros = "(Todos los registros)";
            } else {
                if (filtros.substring(filtros.length() - 2).trim().equals(",")) {
                    String tmp = "";
                    tmp = filtros.substring(0, filtros.length() - 2);
                    filtros = tmp;
                }
            }

            Impresion imprimir = new Impresion();
            if (tipo == 0) {
                imprimir.imprimirListado("ssa_rpt_opciones_x_modulo", col, filtros.toString());
            } else if (tipo == 1) {
                imprimir.exportarExcel("ssa_rpt_opciones_x_modulo_excel", col, filtros.toString());
            }
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }

    }

    private void llenarSistema() throws ServiceException {
        this.lstSistema = getService().findByNamedQuery("Modulo.findOnlyNidModuloPadreAndFlgActivo", new Object[]{Constante.ESTADO_ACTIVO});
    }

    public void llenarModulo() throws ServiceException {
        if(this.busSistema == null){
            this.busSistema = new Long(-99);
        }
        this.busModulo = new Long(-99);
        lstModulo = new ArrayList<Modulo>();
        this.busPerfil = new Long(-99);
        lstPerfil = new ArrayList<Perfil>();
        if(this.busSistema != -99) {
            this.lstModulo = getService().findByNamedQuery("Modulo.findByNidModuloPadreAndFlgActivo", new Object[]{this.busSistema, Constante.ESTADO_ACTIVO});
            
        }
    }

    public void llenarPerfil() throws ServiceException {
        if (this.busSistema == null || this.busSistema == -99) {
            this.busPerfil = new Long(-99);
            lstPerfil = new ArrayList<Perfil>();
        } else {
            if (this.busModulo == null || this.busModulo == -99) {
                this.lstPerfil = getService().findByNamedQuery("Perfil.findByModulo", new Object[]{this.busSistema});
            } else {
                this.lstPerfil = getService().findByNamedQuery("Perfil.findByModulo", new Object[]{this.busModulo});
            }
        }
        this.busPerfil = new Long(-99);
    }
       
    public Long getBusModulo() {
        return busModulo;
    }

    public void setBusModulo(Long busModulo) {
        this.busModulo = busModulo;
    }

    public Long getBusPerfil() {
        return busPerfil;
    }

    public void setBusPerfil(Long busPerfil) {
        this.busPerfil = busPerfil;
    }

    public List<Modulo> getLstModulo() throws ServiceException {
        return lstModulo;
    }

    public void setLstModulo(List<Modulo> lstModulo) {
        this.lstModulo = lstModulo;
    }

//    public List<OpcionesModuloBean> getLstOpcionesModulo() {
//        return lstOpcionesModulo;
//    }
//
//    public void setLstOpcionesModulo(List<OpcionesModuloBean> lstOpcionesModulo) {
//        this.lstOpcionesModulo = lstOpcionesModulo;
//    }
    public List<Perfil> getLstPerfil() {
        return lstPerfil;
    }

    public void setLstPerfil(List<Perfil> lstPerfil) {
        this.lstPerfil = lstPerfil;
    }

    public Long getBusSistema() {
        return busSistema;
    }

    public void setBusSistema(Long busSistema) {
        this.busSistema = busSistema;
    }

    public List<Modulo> getLstSistema() throws ServiceException {
        return lstSistema;
    }

    public void setLstSistema(List<Modulo> lstSistema) {
        this.lstSistema = lstSistema;
    }

    public String getBusCodUsuario() {
        return busCodUsuario;
    }

    public void setBusCodUsuario(String busCodUsuario) {
        this.busCodUsuario = busCodUsuario;
    }

    public TreeNode getRootOpciones() {
        return rootOpciones;
    }

    public void setRootOpciones(TreeNode rootOpciones) {
        this.rootOpciones = rootOpciones;
    }

    public List<OpcionesModuloBean> getOlstOpciones() {
        return olstOpciones;
    }

    public void setOlstOpciones(List<OpcionesModuloBean> olstOpciones) {
        this.olstOpciones = olstOpciones;
    }

    public TreeNode getSelectedOpcionNode() {
        return selectedOpcionNode;
    }

    public void setSelectedOpcionNode(TreeNode selectedOpcionNode) {
        this.selectedOpcionNode = selectedOpcionNode;
    }
    
}
